package config

import (
	"fmt"
	"log"
	"os"
	"strconv"
	"time"

	"gopkg.in/yaml.v3"
)

// Config 配置文件结构体
type Config struct {
	Server   ServerConfig   `yaml:"server"`
	Database DatabaseConfig `yaml:"database"`
	Log      LogConfig      `yaml:"log"`
	Security SecurityConfig `yaml:"security"`
	Auth     AuthConfig     `yaml:"auth"` // 新增认证配置
}

// ServerConfig 服务器配置
type ServerConfig struct {
	Domain string     `yaml:"domain"`
	SSL    SSLConfig  `yaml:"ssl"`
	Admin  HTTPConfig `yaml:"admin"`
	Front  HTTPConfig `yaml:"front"`
	DNS    DNSConfig  `yaml:"dns"`
}

// SSLConfig SSL配置
type SSLConfig struct {
	Enabled  bool   `yaml:"enabled"`
	CertPath string `yaml:"cert_path"`
	KeyPath  string `yaml:"key_path"`
}

// HTTPConfig HTTP服务器配置
type HTTPConfig struct {
	Host string `yaml:"host"`
	Port int    `yaml:"port"`
}

// DNSConfig DNS服务器配置
type DNSConfig struct {
	Host string `yaml:"host"`
	Port int    `yaml:"port"`
}

// DatabaseConfig 数据库配置
type DatabaseConfig struct {
	Redis RedisConfig `yaml:"redis"`
}

// RedisConfig Redis配置
type RedisConfig struct {
	Enabled  bool   `yaml:"enabled"`
	Host     string `yaml:"host"`
	Port     int    `yaml:"port"`
	Password string `yaml:"password"`
	DB       int    `yaml:"db"`
}

// LogConfig 日志配置
type LogConfig struct {
	Level string `yaml:"level"`
	File  string `yaml:"file"`
}

// SecurityConfig 安全配置
type SecurityConfig struct {
	MaxRecordsPerUser    int `yaml:"max_records_per_user"`
	RecordRetentionHours int `yaml:"record_retention_hours"`
	CleanupInterval      int `yaml:"cleanup_interval"`
}

// AuthConfig 认证配置
type AuthConfig struct {
	Enabled bool   `yaml:"enabled"`
	Users   []User `yaml:"users"`
}

// User 用户配置
type User struct {
	Username string `yaml:"username"`
	Password string `yaml:"password"`
	Role     string `yaml:"role"`
}

// LoadConfig 加载配置文件
func LoadConfig(configPath string) (*Config, error) {
	// 首先检查配置文件是否存在
	if _, err := os.Stat(configPath); os.IsNotExist(err) {
		return nil, fmt.Errorf("配置文件不存在: %s", configPath)
	}

	// 读取配置文件
	data, err := os.ReadFile(configPath)
	if err != nil {
		return nil, fmt.Errorf("读取配置文件失败: %v", err)
	}

	// 创建配置结构体
	config := &Config{}

	// 解析 YAML
	if err := yaml.Unmarshal(data, config); err != nil {
		return nil, fmt.Errorf("解析配置文件失败: %v", err)
	}

	// 验证必要配置
	if config.Server.Domain == "" {
		return nil, fmt.Errorf("配置错误: domain 不能为空")
	}

	log.Printf("✅ 配置文件加载成功: %s", configPath)
	log.Printf("   域名: %s", config.Server.Domain)
	log.Printf("   后台管理: %s:%d", config.Server.Admin.Host, config.Server.Admin.Port)
	log.Printf("   前台服务: %s:%d", config.Server.Front.Host, config.Server.Front.Port)
	log.Printf("   DNS服务: %s:%d", config.Server.DNS.Host, config.Server.DNS.Port)
	log.Printf("   认证启用: %v", config.Auth.Enabled)

	return config, nil
}

// GetAdminAddr 获取后台管理地址
func (c *Config) GetAdminAddr() string {
	return c.Server.Admin.Host + ":" + strconv.Itoa(c.Server.Admin.Port)
}

// GetFrontAddr 获取前台地址
func (c *Config) GetFrontAddr() string {
	return c.Server.Front.Host + ":" + strconv.Itoa(c.Server.Front.Port)
}

// GetDNSAddr 获取DNS服务器地址
func (c *Config) GetDNSAddr() string {
	return c.Server.DNS.Host + ":" + strconv.Itoa(c.Server.DNS.Port)
}

// GetRecordRetentionDuration 获取记录保留时间
func (c *Config) GetRecordRetentionDuration() time.Duration {
	return time.Duration(c.Security.RecordRetentionHours) * time.Hour
}

// UseRedis 是否使用Redis
func (c *Config) UseRedis() bool {
	return c.Database.Redis.Enabled
}

// ValidateUser 验证用户
func (c *Config) ValidateUser(username, password string) bool {
	if !c.Auth.Enabled {
		return true // 如果认证未启用，允许所有访问
	}

	for _, user := range c.Auth.Users {
		if user.Username == username && user.Password == password {
			return true
		}
	}
	return false
}

// GetUserRole 获取用户角色
func (c *Config) GetUserRole(username string) string {
	for _, user := range c.Auth.Users {
		if user.Username == username {
			return user.Role
		}
	}
	return ""
}
